<?php
//
function print_array($array){
	echo "\n".'<pre>'."\n";
	print_r($array);
	echo "\n".'</pre>'."\n";
}
//
function in_array_r($needle, $haystack) {
	foreach ($haystack as $v) {
		if (is_array($v)) {
			if (in_array_r($needle, $v) === true) return true;
		}else if ($needle === $v){
			return true;
		}
	}
	return false;
}
//
function array_search_r($needle, $haystack, $key_lookin='') {
	$path = NULL;
    if (!empty($key_lookin) && array_key_exists($key_lookin, $haystack) && $needle === $haystack[$key_lookin]) {
    	$path[] = $key_lookin;
    }else{
        foreach($haystack as $key => $val) {
            if (is_scalar($val) && $val === $needle && empty($key_lookin)) {
            	$path[] = $key;
            	break;
            }else if(is_array($val) && $path = array_search_r($needle, $val, $key_lookin)){
            	array_unshift($path, $key);
            	break;
            }
        }
    }
	return $path;
}
//
function preg_match_r($pattern, $haystack){
	foreach ($pattern as $v) {
		if(is_array($v)){
			preg_match_r($pattern, $v);
		}else{
			return preg_match($pattern, $v);
		}
	}
}
//
function preg_replace_r($pattern, $replace, $haystack){
	foreach ($pattern as $v) {
		if(is_array($v)){
			preg_replace_r($pattern, $replace, $v);
		}else{
			return preg_replace($pattern, $replace, $v);
		}
	}
}
//
function array_walk_recursive(&$input, $funcname){
    if (!is_callable($funcname)) {
        if (is_array($funcname)) {
            $funcname = $funcname[0] . '::' . $funcname[1];
        }
        user_error('array_walk_recursive() Not a valid callback ' . $funcname, E_USER_WARNING);
        return;
    }
	//
    if (!is_array($input) && !is_object($input)) {
        user_error('array_walk_recursive() The argument should be an array or an object', E_USER_WARNING);
        return;
    }
	//
    $args = func_get_args();
	//
    foreach ($input as $key => $item) {
        $callArgs = $args;
        if (is_array($item) || is_object($item)) {
            $thisCall = 'array_walk_recursive';
            $callArgs[1] = $funcname;
        } else {
            $thisCall = $funcname;
            $callArgs[1] = $key;
        }
        $callArgs[0] = &$input[$key];
        call_user_func_array($thisCall, $callArgs);
    }    
}
?>